shannon_
|
Curate
|
|
|
Reged: 06/05/04
|
Posts: 756
|
|
|
|
I've made a script that allows the player to replace a carpet tile with another of the same color. You must be wearing a special ring, otherwise the carpet tiles switch to unnamed versions, which cannot be interacted with. Put the ring back on, and the tiles switch to the named versions.
Now, heres what I have so far:
-------------------
This is the 'named' script:
Begin Ishan_carpetscriptB
short button
short questionState
short doonce
float timer
if ( jjsFurnSwitch == 2 ) ;this is the variable that says you are wearing the ring;
disable
PlaceAtMe Ishan_Mfloor2UN 1 0 0 ;heres where the named object is replaced with the unnamed one;
set doonce to 1
endif
if ( OnActivate == 1 )
Set questionState to 1
Return
endif
if ( questionState == 0 )
Return
endif
if ( questionState == 1 )
MessageBox, "Do you wish to change carpet color now?", "Red", "Blue", "Green"
Set questionState to 2
endif
if ( questionState == 2 )
set button to GetButtonPressed
if ( button == 0 )
MessageBox "Okay."
PlaySound Thunder1
PlaceAtMe Ishan_Mfloor1 1 0 0
set doonce to 0
Set questionState to 0
endif
if ( button == 1 )
MessageBox "Okay."
PlaySound Thunder1
PlaceAtMe Ishan_Mfloor2 1 0 0
set doonce to 0
Set questionState to 0
endif
if ( button == 2 )
MessageBox "Okay."
PlaySound Thunder1
PlaceAtMe Ishan_Mfloor3 1 0 0
set doonce to 0
Set questionState to 0
endif
endif
; waits a few seconds, then completely deletes the figurine to clean the game
if ( GetDisabled == 1 )
Set timer to ( timer + GetSecondsPassed )
if ( timer > 10 )
SetDelete 1
endif
return
endif
End
---------------------
Okay, now heres the 'unnamed' script, which only serves to keep the word 'carpet' from showing up wherever you go. Thats only when you are NOT wearing the ring:
Begin Ishan_carpetscriptBUN
short button
short questionState
short doonce
float timer
if ( jjsFurnSwitch == 2 )
if ( doonce == 0 )
disable
PlaceAtMe Ishan_Mfloor2 1 0 0 ;and this is where the unamed object is replaced by the named;
set doonce to 1
endif
endif
if ( getDisabled == 1 )
set timer to ( Timer + GetSecondsPassed )
if ( timer > 10 )
setdelete, 1
endif
endif
End
--------------------------
The carpet tiles switch color just like I want them to, but when I remove the ring, the game crashes. I know this is a pretty complicated script, but I think I know whats wrong. Somewhere along the line, something I am telling the game to do is happening over and over and over. I need to make that thing only happen once. At least thats how it seems to me.
I really hope someone can help me, because I have no clue what to do next.
Post Extras:
|
shannon_
|
Curate
|
|
|
Reged: 06/05/04
|
Posts: 756
|
|
|
|
Wait a minute...I think I might just see the problem. The ring variable! It's set to the same number in both scripts, thats not right! I'll be back.
Post Extras:
|
shannon_
|
Curate
|
|
|
Reged: 06/05/04
|
Posts: 756
|
|
|
|
Darn, it's not working!! Someone, help!
Post Extras:
|
|
|
Should the carpet be placed manually in game or it has a pre-defined position? If latter, do not bother with PlaceAtMe and SetDelete whatsoever. Place all four carpets at the same point in CS, then enable one of them and disable others depending on ring state.
Code:
begin CarpetRing short worn short OnPCEquip short button
if ( OnPCEquip == 1 ) if ( worn == 0 ) set worn to 1 endif else if ( worn > 1 ) set worn to 0 CarpetRed->Disable CarpetBlue->Disable CarpetGreen->Disable CarpetUnnamed->Enable endif endif
if ( worn == 0 ) return elseif ( worn == 1 ) MessageBox, "Do you wish to change carpet color now?", "Red", "Blue", "Green" set worn to 2 CarpetRed->Disable CarpetBlue->Disable CarpetGreen->Disable CarpetUnnamed->Disable elseif ( worn == 2 ) set button to GetButtonPressed
if ( button == 0 ) MessageBox "Okay." PlaySound Thunder1 CarpetRed->Enable set worn to 3 endif
if ( button == 1 ) MessageBox "Okay." PlaySound Thunder1 CarpetBlue->Enable set worn to 3 endif
if ( button == 2 ) MessageBox "Okay." PlaySound Thunder1 CarpetGreen->Enable set worn to 3 endif
endif
end
Place "unnamed" carpet a single pixel higher than others (you may have to temporarily swicth off "Snap to Grid" setting for that) so that default carpet would override all others without additional scripting.
Post Extras:
|
|
|
if ( jjsFurnSwitch == 2 ) ;this is the variable that says you are wearing the ring; disable PlaceAtMe Ishan_Mfloor2UN 1 0 0 ;heres where the named object is replaced with the unnamed one; set doonce to 1 endif
if ( jjsFurnSwitch == 2 ) if ( doonce == 0 ) disable PlaceAtMe Ishan_Mfloor2 1 0 0 ;and this is where the unamed object is replaced by the named; set doonce to 1 endif endif
Notice the difference between your two scripts? I assume that if jjsFurnSwitch is 2, then the ring is not on your finger. Well the top loop is always run even when doOnce is set to 1.
BTW, you do realize that this tile concept would make for a very interesting puzzle trap/lock, right?
And the guy's suggestion to simply enable/disable four pieces of tile set in the same place is a much more elegant way of doing the job, if that is what you had in mind. And since I did not see any Activate commands, it would appear that you can't actually pick up the tile and move it. The only down side to this that I have found so far (I am doing a simpler idea with replacing inventory items) is that you now have four tiles with scripts all running to see if the ring is on your finger. Now multiply that by the number of tiles you have in the carpet and you will see a significant drop in fps. Your setdelete command eliminates 75% of the running scripts in the carpet. I used while-end loops to replace the inventory items and even fifty replacements caused a noticable slowdown. If I tried to replace more than 100 items, the program tended to crash. But that was with while-end loops...
Post Extras:
|
shannon_
|
Curate
|
|
|
Reged: 06/05/04
|
Posts: 756
|
|
|
|
militech, I saw that ring variable problem, fixed it and still had crashes.
Heres a couple pics to illustrate what I'm talking about, I don't know if I explained it very well.
I only have to place one layer in the CS
the player then changes each tile individualy
this is with the ring on, the carpets are named, so you can interact with them
ring off, no-name carpets, placed in same place, cant interact with these
I based most of the scripts from the 'real funiture' mod, and they work fine. But for this one, I made a few alterations, because you can't pick the carpet up or rotate it, but it slows down on me when I unequip the ring, and freezes entirely when I put it back on.
I can't understand why it works so well for the furniture, and not for the carpets!
Kir's idea sounds pretty good, but wont having a room full of that many scripted objects slow things down? Thats why I want to replace, disable, then delete. (because disable does not get rid of things completely, or so I've heard) Besides, it's easier to place one layer of tiles than four...
Post Extras:
|
Simpleton
|
Acolyte
|
|
|
Reged: 07/02/04
|
Posts: 138
|
Loc: Earlham College, Richmond, IN
|
|
|
It's hard to say without being able to actually see what's going on. If you'd like I'd be willing to debug it for you. If you do I'll pm you a link to upload the esp to.
-------------------- Do you have a burning desire to give me money?
Click Here to Donate
Post Extras:
|
shannon_
|
Curate
|
|
|
Reged: 06/05/04
|
Posts: 756
|
|
|
|
Id love to do that, but someone has screwed with my browser settings, and I probably would be denied access to most sites...unfortunaley that someone is not home at the moment so that I can wring their neck.
As soon as get this password thing removed, I'd be happy to accept your help.
Post Extras:
|
|
|
militech, I saw that ring variable problem, fixed it and still had crashes.
I always wondered why people never could get the point I am trying to make. Perhaps I should try communicating explicitly instead of implicitly.
I was trying to get you to look at the fact that you are missing a loop to deal with the fact that DoOnce is no longer zero in the first sample, but you remembered to take care of it in the second. Your intuition about what was causing the crash was dead on target. And yes, I also spend days sometimes staring at my own code without realizing that I had forgotten an if condition. It's because we tend to see what is not there when it's our own code. Just add an
if ( doOnce == 0 )
disable PlaceAtMe Ishan_Mfloor2UN 1 0 0 ;heres where the named object is replaced with the unnamed one; set doonce to 1
endif ; doOnce loop
Heres a couple pics to illustrate what I'm talking about, I don't know if I explained it very well.
I based most of the scripts from the 'real funiture' mod, and they work fine. But for this one, I made a few alterations, because you can't pick the carpet up or rotate it, but it slows down on me when I unequip the ring, and freezes entirely when I put it back on.
It was pretty clear to me what you were trying to do (remember, I have already done something in the same vein). Now the slowdown is due to every single tile running the following:
Begin Ishan_carpetscriptBUN
short button short questionState short doonce float timer
if ( jjsFurnSwitch == 2 ) if ( doonce == 0 ) disable PlaceAtMe Ishan_Mfloor2 1 0 0 ;and this is where the unamed object is replaced by the named; set doonce to 1 endif endif . . . etc.
p.s. note that you have the variables questionState and button declared here but not used.
I can't understand why it works so well for the furniture, and not for the carpets!
I'm willing to bet that there are fewer pieces of furniture with scripts running than you have tiles on the floor.
Kir's idea sounds pretty good, but wont having a room full of that many scripted objects slow things down? Thats why I want to replace, disable, then delete. (because disable does not get rid of things completely, or so I've heard) Besides, it's easier to place one layer of tiles than four...
If you are already seeing a degradation of cpu speed with just one layer, you should probably multiply that slowdown by four if you have four layers. Your way is the least cpu intensive. And yes, if you do not delete the object, the script attached to it will still run while the object is disabled ( = just not rendered/visible to the player).
As for layering four tiles in the same place, just copy the x, y, z co-ords of the first tile into the locations of the other two (unnamed tile is one pixel higher on the z-axis).
Good luck.
Post Extras:
|
ManaUser
|
Master
|
|
|
Reged: 05/31/00
|
Posts: 6115
|
Loc: Long Beach, CA, USA
|
|
|
It's a little hard to follow, but I'd say there's a very good chance the crash is due to using SetDelete in the same frame as another funtion on that object. Try replacing your current SetDelete section with this this at the top of the script (right after variable declaration).
Code:
if ( GetDisabled == 1 ) SetDelete 1 return endif
The timer method, while thought to be good at one time, only complicates things.
Post Extras:
|
shannon_
|
Curate
|
|
|
Reged: 06/05/04
|
Posts: 756
|
|
|
|
Thank you militech! It's working!!!!!!!!!!!!!!!!!!
I could just kiss you. I knew it had to be some little detail I overlooked, because the script tried to work. Now it works perfectly, not a hint of slowdown at all.
This will be a very handy script to have, all you have to do is script a few meshes, and place one of them on the floor, for customizable housing. I bet that it could be used to switch tileset parts too. Imagine, build a imperial interior, and make them switch to stronghold parts. Or if you had multiple retextures of a certain tileset, you could build a transformable house.
Post Extras:
|
|
|
This will be a very handy script to have, all you have to do is script a few meshes, and place one of them on the floor, for customizable housing. I bet that it could be used to switch tileset parts too. Imagine, build a imperial interior, and make them switch to stronghold parts. Or if you had multiple retextures of a certain tileset, you could build a transformable house.
Personally, I still think that it would make a better trap or puzzle, but hey, I'm an engineer, not an interior decorator...
Although, a Go-Go Gadget House would be quite the thing to see. With a simple wearing of the right ring, you can watch your castle disguise itself as a fishing shack (one big fishing shack, but still a fishing shack). You have got to look into transformable exteriors! You could give a literal meaning to the saying 'A man's home is his castle' and start a whole new wave of housing construction.
Post Extras:
|
|
|
Hey, your idea got me thinking about something on a tangential line:
What if a modder added a virtually unkillable monster as guardian for a lair (e.g. an uber rat). The powergamers would probably just give up trying to get into the lair after a few tries, but for the players that like to think and follow leads, there could be a legendary weapon (e.g. normal dagger with a script attached) that could be sought out to slay the beast. If the guardian detects the weapon equipped in the pc's hands, a script like yours would substitute the uber creature for a normal one. If they foolishly switch to their uber weapon...
Interesting possibilities...
Post Extras:
|